// console.log('Script开始')
// setTimeout(() => {
//   console.log('第一个回调函数，宏任务1')
//   Promise.resolve().then(function () {
//     console.log('第四个回调函数，微任务2')
//   })
// }, 0)
// setTimeout(() => {
//   console.log('第二个回调函数，宏任务2')
//   Promise.resolve().then(function () {
//     console.log('第五个回调函数，微任务3')
//   })
// }, 0)
// Promise.resolve().then(function () {
//   console.log('第三个回调函数，微任务1')
// })
// console.log('Script结束')

// 第二段
// console.log('Script开始')
// setTimeout(() => {
//   console.log('宏任务1（setTimeout)')
//   Promise.resolve().then(() => {
//     console.log('微任务promise2')
//   })
// }, 0)
// setTimeout(() => {
//   console.log('宏任务3（setTimeout)')
// }, 0)
// console.log('Script结束')
// Promise.resolve().then(() => {
//   console.log('微任务promise1')
// })
// process.nextTick(() => {
//   console.log('微任务nextTick')
// })
// setImmediate(() => {
//   console.log('宏任务2')
// })

// 第三段
// async function async1 () {
//   const obj = await async2()
//   setTimeout(() => {
//     console.log('setTomeout:', obj)
//   }, 0)
//   console.log('async1 end')
// }

// async function async2 () {
//   console.log('async2 end')
//   return { a: 1 }
// }
// async1()

// setTimeout(function () {
//   console.log('settimout')
// }, 0)
// new Promise(resolve => {
//   console.log('Promise')
//   resolve()
// })
//   .then(function () {
//     console.log('promise1')
//   })
//   .then(function () {
//     console.log('promise2')
//   })
// async2 end -> Promise -> async1 end -> promise1 -> promise2 -> settimeout
// inner -> inner-promise -> inner-timeout -> oute -> outer-promise -> outer-timeout
// 宏任务 ：主代码块f1；promise
// 微任务 ：f2结束；f1结束；
// 输出：f3时结束 -> new Promise -> f2结束；f1结束；-> promise1 promise2

// 第四段
// async function f1 () {
//   await f2()
//   console.log('f1结束')
// }

// async function f2 () {
//   await f3()
//   console.log('f2结束')
// }
// async function f3 () {
//   console.log('f3结束')
// }
// f1()
// new Promise(resolve => {
//   console.log('Promise')
//   resolve()
// }).then(res => {
//   console.log('promise1')
// }).then(res => {
//   console.log('promise2')
// })
// 第一轮循环

// 宏任务：主代码块，2，9
// 微任务：6；8；3;5;
// 1 -> 7 -> 6 -> 8 -> 2 -> 4 -> 3, 5, 9, 11, 10, 12
// 第五段
// console.log('1')
// setTimeout(function () {
//   console.log('2')
//   Promise.resolve().then(function () {
//     console.log('3')
//   })
//   new Promise(resolve => {
//     console.log('4')
//     resolve()
//   }).then(() => {
//     console.log('5')
//   })
// })

// Promise.resolve().then(function () {
//   console.log('6')
// })
// new Promise(resolve => {
//   console.log('7')
//   resolve()
// }).then(() => {
//   console.log('8')
// })

// setTimeout(function () {
//   console.log('9')
//   Promise.resolve().then(function () {
//     console.log('10')
//   })
//   new Promise(resolve => {
//     console.log('11')
//     resolve()
//   }).then(() => {
//     console.log('12')
//   })
// })

// 第六段(类似上面)
// console.log('1')

// setTimeout(function () {
//   console.log('2')
//   process.nextTick(function () {
//     console.log('3')
//   })
//   new Promise(function (resolve) {
//     console.log('4')
//     resolve()
//   }).then(function () {
//     console.log('5')
//   })
// })
// process.nextTick(function () {
//   console.log('6')
// })
// new Promise(function (resolve) {
//   console.log('7')
//   resolve()
// }).then(function () {
//   console.log('8')
// })

// setTimeout(function () {
//   console.log('9')
//   process.nextTick(function () {
//     console.log('10')
//   })
//   new Promise(function (resolve) {
//     console.log('11')
//     resolve()
//   }).then(function () {
//     console.log('12')
//   })
// })
// 1, 7, 6,8,2,4,3,5,9,11,10, 12

// 第七段
// 主代码块
// 宏任务：timeout1, immediate1, timeout2, immediate2
// 微任务：globel_nextTick;globel_then;globel2_nextTick;;globel_then2
// global1 -> globel_promise1 -> globel_promise2 -> ---> globel_nextTick -> globel2_nextTick -> globel_then -> globel_then2

// 微任务：timeout_nextTick1; timeout_then
// timeout1  -> timeout1_promise -> timeout_nextTick1 -> timeout_then

// 微任务：immediate1_nextTick;immediate1_then
// immediate1 -> immediate1_promise -> immediate1_nextTick -> immediate1_then

// 微任务：timeout2_nextTick1; timeout2_then
// timeout2 -> timeout2_promise -> timeout2_nextTick1 -> timeout2_then

// 微任务：immediate2_nextTick;immediate2_then
// immediate2 -> immediate2_promise -> immediate2_nextTick -> immediate2_then

// demo02 最后一段
// console.log('golb1')

// setTimeout(function () {
//   console.log('timeout1')
//   process.nextTick(function () {
//     console.log('timeout1_nextTick')
//   })
//   new Promise(function (resolve) {
//     console.log('timeout1_promise')
//     resolve()
//   }).then(function () {
//     console.log('timeout1_then')
//   })
// })

// setImmediate(function () {
//   console.log('immediate1')
//   process.nextTick(function () {
//     console.log('immediate1_nextTick')
//   })
//   new Promise(function (resolve) {
//     console.log('immediate1_promise')
//     resolve()
//   }).then(function () {
//     console.log('immediate1_then')
//   })
// })

// process.nextTick(function () {
//   console.log('glob1_nextTick')
// })
// new Promise(function (resolve) {
//   console.log('glob1_promise')
//   resolve()
// }).then(function () {
//   console.log('glob1_then')
// })

// // var timer = setInterval(function () {
// //   console.log('setInterVal')
// // }, 1000)

// setTimeout(function () {
//   console.log('timeout2')
//   process.nextTick(function () {
//     console.log('timeout2_nextTick')
//   })
//   new Promise(function (resolve) {
//     console.log('timeout2_promise')
//     resolve()
//   }).then(function () {
//     console.log('timeout2_then')
//     // clearInterval(timer)
//   })
// }, 1000)

// process.nextTick(function () {
//   console.log('glob2_nextTick')
// })
// new Promise(function (resolve) {
//   console.log('glob2_promise')
//   resolve()
// }).then(function () {
//   console.log('glob2_then')
// })

// setImmediate(function () {
//   console.log('immediate2')
//   process.nextTick(function () {
//     console.log('immediate2_nextTick')
//   })
//   new Promise(function (resolve) {
//     console.log('immediate2_promise')
//     resolve()
//   }).then(function () {
//     console.log('immediate2_then')
//   })
// })
